2026-10-18T05:50:50.1724222Z ##[group]Run npm run test:deploy
2026-10-18T05:50:50.1724282Z [36;1mnpm run test:deploy[0m
2026-10-18T05:50:50.1724312Z shell: /usr/bin/bash -e {0}
2026-10-18T05:50:50.1724325Z env:
2026-10-18T05:50:50.1724341Z   CARGO_TERM_COLOR: never
2026-10-18T05:50:50.1724470Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-18T05:50:50.1724489Z   WRANGLER_SEND_METRICS: false
2026-10-18T05:50:50.1724508Z ##[endgroup]
2026-10-18T05:50:50.6601266Z 
2026-10-18T05:50:50.6601485Z > test:deploy
2026-10-18T05:50:50.6601527Z > node --test "scripts/deploy/*.test.mjs"
2026-10-18T05:50:50.6601546Z 
2026-10-18T05:50:50.8907462Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (4.117142ms)
2026-10-18T05:50:50.8937780Z ✔ the toolchain is read from rustc -V (0.60916ms)
2026-10-18T05:50:50.8948153Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.46787ms)
2026-10-18T05:50:50.8960500Z ✔ a unit's hash is read from its files and folders (0.995031ms)
2026-10-18T05:50:50.8978738Z ✔ only the units the build did not use are pruned (5.705193ms)
2026-10-18T05:50:52.4094747Z error: no matching package named `base64` found
2026-10-18T05:50:52.6354792Z location searched: crates.io index
2026-10-18T05:50:52.6354966Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-18T05:50:52.6355091Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-18T05:50:52.6355194Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-18T05:50:52.9197432Z ✔ the manifest matches every wrangler config in the repository (53.585166ms)
2026-10-18T05:50:52.9204007Z ✔ every wrangler.jsonc is found, and only checked-in ones (34.976287ms)
2026-10-18T05:50:52.9206318Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (42.09438ms)
2026-10-18T05:50:52.9211098Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.937551ms)
2026-10-18T05:50:52.9229887Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (1.18164ms)
2026-10-18T05:50:52.9230154Z ✔ Rust workers build with the shared script and the same wasm-opt level (1.231761ms)
2026-10-18T05:50:52.9230430Z ✔ shared crates and packages are read from workspace metadata (0.53347ms)
2026-10-18T05:50:52.9232695Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.750751ms)
2026-10-18T05:50:52.9237986Z ✔ services/runner/base.json records the base its folder builds (22.772081ms)
2026-10-18T05:50:52.9261594Z ✔ an image's hash ignores line endings, and its tags say what they are (209.13505ms)
2026-10-18T05:50:52.9278448Z ✔ only the lockfile entries the runner is built from name its image (0.64341ms)
2026-10-18T05:50:52.9279858Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (39.595889ms)
2026-10-18T05:50:52.9283537Z ✔ the registry is asked for an image's manifest, without Docker (1.719061ms)
2026-10-18T05:50:52.9285031Z ✔ a push counts only when it ends with a digest, and is tried again (1.43464ms)
2026-10-18T05:50:52.9286757Z ✔ a static Linux binary is told from a dynamic one (1.371341ms)
2026-10-18T05:50:52.9365316Z ﹣ path dependencies agree with Cargo's own resolved graph (862.468821ms) # cargo metadata could not resolve offline
2026-10-18T05:50:52.9365525Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (114.415015ms)
2026-10-18T05:50:52.9365609Z ✔ a shared crate's change reaches every unit built from it, and no other (0.963801ms)
2026-10-18T05:50:52.9365690Z ✔ a shared package's change reaches what imports it (0.37271ms)
2026-10-18T05:50:52.9365754Z ✔ a crate's tests, benches and examples deploy nothing (0.58329ms)
2026-10-18T05:50:52.9365823Z ✔ a Rust file compiled only for tests is found from what declares it (2.464301ms)
2026-10-18T05:50:52.9365881Z ✔ this repository's test-only sources are read from git (362.896313ms)
2026-10-18T05:50:52.9365943Z ✔ decide: a change only to tests deploys nothing (2.422292ms)
2026-10-18T05:50:52.9366000Z ✔ own folders, declared inputs and root files (0.85289ms)
2026-10-18T05:50:52.9366062Z ✔ a Cargo.lock change reaches only crates that use what changed (0.68389ms)
2026-10-18T05:50:52.9366118Z ✔ a package-lock change reaches through workspace links (0.752401ms)
2026-10-18T05:50:52.9366173Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.48062ms)
2026-10-18T05:50:52.9366233Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.29923ms)
2026-10-18T05:50:52.9366300Z ✔ decide: Cargo.lock counts only where it reaches (0.775681ms)
2026-10-18T05:50:52.9400738Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.41964ms)
2026-10-18T05:50:52.9400910Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (2.010061ms)
2026-10-18T05:50:52.9401005Z ✔ units are picked by short name, folder or Worker name (0.86737ms)
2026-10-18T05:50:52.9401091Z ✔ a CI job installs only what its units need (1.718981ms)
2026-10-18T05:50:52.9401170Z ✔ a deploy is annotated with its commit, and read back (0.47008ms)
2026-10-18T05:50:52.9401471Z ✔ the live commit: the live version's, looking through secret changes (0.611581ms)
2026-10-18T05:50:52.9402206Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.62161ms)
2026-10-18T05:50:52.9403087Z ✔ the API's answers: the live commit as Wrangler's would give it (2.057701ms)
2026-10-18T05:50:53.4165644Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (502.99526ms)
2026-10-18T05:50:53.6650676Z ✔ the API is used only with the token Wrangler would be given (0.6641ms)
2026-10-18T05:50:53.6650839Z ✔ pending migrations: the folder's files less the names in d1_migrations (2.947672ms)
2026-10-18T05:50:53.6650938Z ✔ the pool runs everything, no more than its limit at once (16.847448ms)
2026-10-18T05:50:53.6651013Z ✔ self-hosting builds every Rust service the manifest says it runs (0.93509ms)
2026-10-18T05:50:53.6651072Z ✔ the self-hosting architecture page names every unit (0.375891ms)
2026-10-18T05:50:53.6651149Z ✔ the architecture's services page names every unit, with the services it binds to (7.601354ms)
2026-10-18T05:50:53.6651215Z ✔ resolveStack works on a manifest with no workspace crates or packages (3.830831ms)
2026-10-18T05:50:53.6651306Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.43554ms)
2026-10-18T05:50:53.6651379Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (2.774041ms)
2026-10-18T05:50:53.6651443Z ✔ a failed wrangler command is reported by its error, not its trace (0.40706ms)
2026-10-18T05:50:53.6651507Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.629501ms)
2026-10-18T05:50:53.6651588Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.42151ms)
2026-10-18T05:50:53.6651651Z ✔ the deploy tool itself parses: a test that never imports it would not notice (47.484213ms)
2026-10-18T05:50:54.1612799Z ✔ the statements are all there (2.126821ms)
2026-10-18T05:50:54.1613001Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (92.862754ms)
2026-10-18T05:50:54.1631476Z ✔ revoking an unused invite gives it back; an expired one never counted (139.203647ms)
2026-10-18T05:50:54.1634986Z ✔ a used invite is spent: revoking it does nothing and it still counts (80.578818ms)
2026-10-18T05:50:54.1637736Z ✔ a pending invite for the same address is found; a revoked one is not (81.657519ms)
2026-10-18T05:50:54.1640807Z ✔ staff grants add to the twenty and can take some back (74.324816ms)
2026-10-18T05:50:54.1655685Z ✔ signing up from the link spends the invite once and records who invited whom (71.776544ms)
2026-10-18T05:50:54.2696568Z ✔ a body that broke off is worth another try, a lockfile out of step is not (2.120971ms)
2026-10-18T05:50:54.2712123Z ✔ an install that ends without saying why, or stalls, is tried again (0.33135ms)
2026-10-18T05:50:54.2729955Z ✔ a dropped connection is tried again until the install passes (6.035163ms)
2026-10-18T05:50:54.2750498Z ✔ a real error fails at once (0.37613ms)
2026-10-18T05:50:54.2750840Z ✔ it gives up after its tries, with npm's exit code (0.55831ms)
2026-10-18T05:50:54.2750870Z ✔ a stalled install is run again (0.42449ms)
2026-10-18T05:50:54.8729373Z ✔ webhooks: the hourly purge deletes old deliveries by time (3.501921ms)
2026-10-18T05:50:54.8729520Z ✔ billing: this month's users are read from an index, not the ledger (102.570669ms)
2026-10-18T05:50:54.8729603Z ✔ events: a repository's events of one type, newest first, page by page (7.330183ms)
2026-10-18T05:50:54.8729684Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (23.663102ms)
2026-10-18T05:50:54.8729762Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (5.510792ms)
2026-10-18T05:50:54.8729849Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (6.161383ms)
2026-10-18T05:50:54.8730101Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (5.700863ms)
2026-10-18T05:50:54.8730167Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (7.775424ms)
2026-10-18T05:50:54.8730241Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.85422ms)
2026-10-18T05:50:54.8730305Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (1.451251ms)
2026-10-18T05:50:54.8730370Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.52651ms)
2026-10-18T05:50:54.8730433Z ✔ image references and bearer challenges are read (0.922641ms)
2026-10-18T05:50:54.8730521Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (44.508951ms)
2026-10-18T05:50:54.8730586Z ✔ a base that is not where it should be, or not what base.json says, stops it (2.229471ms)
2026-10-18T05:50:54.8730667Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (3.476612ms)
2026-10-18T05:50:54.8731017Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-18T05:50:54.8731101Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-18T05:50:54.8731182Z ✔ fields read numbers, ranges, lists and steps (3.320171ms)
2026-10-18T05:50:54.8731257Z ✔ the services' crons match when hosted g1t's would fire (5.531382ms)
2026-10-18T05:50:54.8731332Z ✔ what is due is each matching cron of each service (0.94159ms)
2026-10-18T05:50:54.8731406Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (54.966676ms)
2026-10-18T05:50:55.0324087Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (54.528696ms)
2026-10-18T05:50:55.0333928Z ✔ an announcement that fails is a warning, never a failed deploy (1.421211ms)
2026-10-18T05:50:55.0346193Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (1.766061ms)
2026-10-18T05:50:55.0362127Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (1.13859ms)
2026-10-18T05:50:55.2944885Z ✔ discover actual hashed assets without archiving icons, source maps or library defaults (4.294792ms)
2026-10-18T05:50:55.2951511Z ✔ archive the old release's transitive chunks before replacing it (44.769732ms)
2026-10-18T05:50:55.2976432Z ✔ archive failures block cutover and immutable filename collisions are refused (5.349002ms)
2026-10-18T05:50:55.2976667Z ✔ a missing live asset aborts the archive instead of saving an HTML error as CSS (1.680841ms)
2026-10-18T05:50:55.2977294Z ✔ a release manifest skips unchanged uploads without scanning deployment history (1.712701ms)
2026-10-18T05:50:55.2978388Z ✔ provider rate limits wait and retry; persistent failure remains a failure (1.836191ms)
2026-10-18T05:50:55.2980318Z ✔ cutover verifies old and new assets and rejects HTML fallback or wrong build (4.301722ms)
2026-10-18T05:50:55.2993164Z ✔ cutover tolerates propagation delay but still requires the expected build and asset bytes (4.223252ms)
2026-10-18T05:50:59.0028602Z ✔ 1000 successive releases keep old tabs' assets and perform bounded incremental archive work (3717.188343ms)
2026-10-18T05:50:59.1751920Z ℹ tests 101
2026-10-18T05:50:59.1751990Z ℹ suites 0
2026-10-18T05:50:59.1752017Z ℹ pass 100
2026-10-18T05:50:59.1752045Z ℹ fail 0
2026-10-18T05:50:59.1752065Z ℹ cancelled 0
2026-10-18T05:50:59.1752085Z ℹ skipped 1
2026-10-18T05:50:59.1752107Z ℹ todo 0
2026-10-18T05:50:59.1752135Z ℹ duration_ms 8293.282504
